package com.xp.dto;

import lombok.Data;
import java.util.List;
import java.util.Map;

/**
 * LiteFlow转换结果DTO
 * 
 * @author xp
 * @since 2025-01-01
 */
@Data
public class LiteFlowConvertResult {

    /**
     * 转换是否成功
     */
    private boolean success;

    /**
     * LiteFlow EL表达式
     */
    private String elExpression;

    /**
     * 节点组件映射信息
     */
    private Map<String, NodeComponentInfo> nodeComponentMapping;

    /**
     * 错误信息
     */
    private String errorMessage;

    /**
     * 警告信息列表
     */
    private List<String> warnings;

    /**
     * 转换统计信息
     */
    private ConvertStatistics statistics;

    /**
     * 节点组件信息
     */
    @Data
    public static class NodeComponentInfo {
        /**
         * 节点ID
         */
        private String nodeId;
        
        /**
         * 节点类型
         */
        private String nodeType;
        
        /**
         * 组件名称
         */
        private String componentName;
        
        /**
         * 组件类名
         */
        private String componentClass;
        
        /**
         * 节点配置
         */
        private Map<String, Object> nodeConfig;
        
        /**
         * 是否需要创建新组件
         */
        private boolean needCreateComponent;
    }

    /**
     * 转换统计信息
     */
    @Data
    public static class ConvertStatistics {
        /**
         * 总节点数
         */
        private int totalNodes;
        
        /**
         * 总连线数
         */
        private int totalEdges;
        
        /**
         * 成功转换的节点数
         */
        private int convertedNodes;
        
        /**
         * 跳过的节点数
         */
        private int skippedNodes;
        
        /**
         * 转换耗时（毫秒）
         */
        private long convertTime;
    }

    /**
     * 创建成功结果
     * 
     * @param elExpression EL表达式
     * @param nodeComponentMapping 节点组件映射
     * @return 转换结果
     */
    public static LiteFlowConvertResult success(String elExpression, Map<String, NodeComponentInfo> nodeComponentMapping) {
        LiteFlowConvertResult result = new LiteFlowConvertResult();
        result.setSuccess(true);
        result.setElExpression(elExpression);
        result.setNodeComponentMapping(nodeComponentMapping);
        return result;
    }

    /**
     * 创建失败结果
     * 
     * @param errorMessage 错误信息
     * @return 转换结果
     */
    public static LiteFlowConvertResult failure(String errorMessage) {
        LiteFlowConvertResult result = new LiteFlowConvertResult();
        result.setSuccess(false);
        result.setErrorMessage(errorMessage);
        return result;
    }
}